# cv2：用于读取图像文件，是 OpenCV 库的 Python 接口，提供了丰富的图像处理功能。
# WordCloud(词云)：用于生成词云的库。
# Image和ImageTk：PIL（Python Imaging Library）中的模块，用于处理图像和将图像转换为tkinter可以使用的格式。
# numpy：用于处理数值计算，特别是对图像数据（以数组形式）进行操作。
# jieba：中文分词库，用于将中文文本分割成词语。
# tkinter：Python 的标准 GUI 库，用于创建图形用户界面。
# BytesIO：用于在内存中处理字节流，方便将词云图片转换为字节流形式。
import cv2
from wordcloud import WordCloud
from PIL import Image, ImageTk
import numpy as np
import jieba
import tkinter as tk
from io import BytesIO
# cv2.imread('d:\\img2.jpg')：从指定路径d:\\img2.jpg读取图像文件，将其存储为numpy数组形式（img）。
# cv2.cvtColor(img, cv2.COLOR_BGR2RGB)：将图像的颜色格式从 BGR（OpenCV 默认格式）转换为 RGB 格式，
# 因为WordCloud库要求掩码图像为 RGB 格式。
# np.array(img)：将转换后的图像数据转换为numpy数组，以便作为WordCloud的掩码使用。
img = cv2.imread('d:\\img2.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
mask = np.array(img)

# jieba.lcut('龚琪,付道阳,尹明浩,韩鸣雷,李嫣,孟繁博,...')：
# 使用jieba库对给定的包含多个名字的字符串进行分词，返回一个词语列表（list1）。
# " ".join(list1)：将分词后的词语列表用空格连接成一个字符串（words），
# 这是WordCloud库生成词云所需要的文本格式。
list1 = jieba.lcut('龚琪,付道阳,尹明浩,韩鸣雷,李嫣,孟繁博,'
                   '李天军,付程前,韦鑫博,王博,夏宸赫,秦善壮,'
                   '崔鹏飞,冯钧炜,刘洋,杨树,臧怡豪,刘东雨,'
                   '李思源,苏彦熙,吕浩天,闫晨旭,秦向伟,刘若涵,'
                   '董博,黄煜枫,徐思远,余佳焕,郭依帆,何甜甜,'
                   '张佳,李媛玲,李文博,林聪,褚衍豪,李佳伟,'
                   '王雪凌,刘怡彤,屈春满,刘航博,杨江海,张安琪,'
                   '刘如意,常爽,孙广超,王浩洋,盖焱,李国玉,李嘉庆')
words = " ".join(list1)  # 使用正确的分词结果生成文本

# WordCloud(词云)(mask=mask, background_color="white", mode="RGB",
# font_path='C:\\Windows\\Fonts\\simhei.ttf')：
# 创建一个WordCloud对象，指定掩码图像（mask）、背景颜色为白色、颜色模式为 RGB，
# 并设置中文字体路径（确保字体文件存在）。
# wc.generate(words)：根据准备好的文本数据（words）生成词云。
wc = WordCloud(mask=mask, background_color="white", mode="RGB",
                font_path='C:\\Windows\\Fonts\\simhei.ttf')
wc.generate(words)

# BytesIO()：创建一个内存中的字节流对象（image_bytes）。
# wc.to_image().save(image_bytes, format='PNG')：
# 将生成的词云转换为图像对象，然后将其以 PNG 格式保存到字节流中。
# image_bytes.seek(0)：将字节流的指针重置到开头，以便后续从字节流中读取数据。
image_bytes = BytesIO()
wc.to_image().save(image_bytes, format='PNG')
image_bytes.seek(0)
# tk.Tk()：创建tkinter的主窗口对象（root）。
# root.withdraw()：隐藏主窗口，因为这里不需要显示主窗口，只需要显示词云的顶级窗口。
# tk.Toplevel(root)：在主窗口之上创建一个新的顶级窗口（top）用于显示词云图片。
# top.title("词云展示")：设置顶级窗口的标题为 “词云展示”。
# ImageTk.PhotoImage(Image.open(image_bytes))：
# 从字节流中打开图像数据并转换为tkinter可以使用的PhotoImage对象（photo）。
# tk.Label(top, image=photo)：在顶级窗口（top）中创建一个标签组件（label），
# 并将词云图片设置为标签的图像。
# label.pack()：使用pack几何管理器将标签组件放置在顶级窗口中，使其显示词云图片。
root = tk.Tk()
root.withdraw()

top = tk.Toplevel(root)
top.title("词云展示")

photo = ImageTk.PhotoImage(Image.open(image_bytes))
label = tk.Label(top, image=photo)
label.pack()

# def on_close():...：定义一个函数（on_close），
# 用于在窗口关闭时执行的操作，
# 这里是销毁顶级窗口（top.destroy()）和退出tkinter主循环（root.quit()）。
# top.protocol("WM_DELETE_WINDOW", on_close)：
# 将on_close函数绑定到顶级窗口的关闭事件上，
# 当用户点击关闭按钮时，会执行on_close函数中的操作。
# root.mainloop()：启动tkinter的主事件循环，
# 使界面保持响应状态，不断监听用户事件（如鼠标点击、键盘输入等），直到窗口关闭。
def on_close():
    top.destroy()
    root.quit()

top.protocol("WM_DELETE_WINDOW", on_close)

root.mainloop()